/*******************************************************************************
** 文件名称：page_mgr.h
** 文件作用：页面管理
** 编写作者：Tom Free 付瑞彪
** 编写时间：2021-05-30
** 文件备注：
** 更新记录：
**           2021-05-30 -> 创建文件
**                                                            <Tom Free 付瑞彪>
**
**           Copyright (c) 2018-2021 付瑞彪 All Rights Reserved
**
**       1 Tab == 4 Spaces     UTF-8     ANSI C Language(C99)
*******************************************************************************/
#ifndef __PAGE_MGR_H__
#define __PAGE_MGR_H__

#include "chip_cfg.h"

/* 页面ID */
typedef enum
{
    PAGE_TIME_DISPLAY,                  /* 时间显示页面 */
    PAGE_SET_TIME_HOUR,                 /* 时间小时设置页面 */
    PAGE_SET_TIME_MINUTE,               /* 时间分钟设置页面 */
    PAGE_SET_TIME_SECOND,               /* 时间秒钟设置页面 */
    PAGE_SET_ALARM_HOUR,                /* 闹钟小时设置页面 */
    PAGE_SET_ALARM_MINUTE,              /* 闹钟分钟设置页面 */
    PAGE_SET_ALARM_SECOND,              /* 闹钟秒钟设置页面 */

    PAGE_ID_MAX                         /* 页面总数 */
} page_id_t;

/* 事件类型 */
typedef enum
{
    PAGE_EVENT_ID_NONE,                 /* 无事件发生 */
    PAGE_EVENT_BTN_MODE_CLICK,          /* 模式按键单击 */
    PAGE_EVENT_BTN_MODE_LONG_PRESS,     /* 模式按键长按 */
    PAGE_EVENT_BTN_MODE_LONG_REPEAT,    /* 模式按键长按重复 */
    PAGE_EVENT_BTN_INC_CLICK,           /* 增大按键单击 */
    PAGE_EVENT_BTN_INC_LONG_PRESS,      /* 增大按键长按 */
    PAGE_EVENT_BTN_INC_LONG_REPEAT,     /* 增大按键长按重复 */
    PAGE_EVENT_BTN_DEC_CLICK,           /* 减小按键单击 */
    PAGE_EVENT_BTN_DEC_LONG_PRESS,      /* 减小按键长按 */
    PAGE_EVENT_BTN_DEC_LONG_REPEAT,     /* 减小按键长按重复 */
    PAGE_EVENT_TIMER_100MS,             /* 100ms定时时间到 */
    
    PAGE_EVENT_ID_MAX                   /* 事件ID总个数 */
} page_event_t;

/* 进入页面回调函数类型定义 */
typedef void page_into_cb_t(page_id_t);
/* 处理事件回调函数类型定义 */
typedef void page_exec_cb_t(page_id_t, page_event_t);
/* 轮询页面回调函数类型定义 */
typedef void page_poll_cb_t(page_id_t);
/* 退出页面回调函数类型定义 */
typedef void page_exit_cb_t(page_id_t);

/* 页面类 */
typedef struct
{
    /* 回调函数表 */
    page_into_cb_t *into_cb;        /* 进入页面回调函数 */
    page_exec_cb_t *exec_cb;        /* 处理事件回调函数 */
    page_poll_cb_t *poll_cb;        /* 轮询页面回调函数 */
    page_exit_cb_t *exit_cb;        /* 退出页面回调函数 */
} page_t;

/* 导出页面 */
#define PAGE_EXPORT(page_name, into_cb, exec_cb, poll_cb, exit_cb)      \
    const page_t page_inst_ ## page_name =                              \
    {                                                                   \
        into_cb,                                                        \
        exec_cb,                                                        \
        poll_cb,                                                        \
        exit_cb                                                         \
    };

/* 导入页面 */
#define PAGE_IMPORT(page_name)                                          \
    extern const page_t page_inst_ ## page_name;

/* 引用 */
#define PAGE_QUOTE(page_name)                                           \
    &page_inst_ ## page_name

/* 初始化 */
void page_mgr_init(void);

/* 页面切换 */
void page_mgr_switch(page_id_t page_id);

/* 解析事件 */
void page_mgr_parse_event(page_event_t evt);

/* 页面轮询 */
void page_mgr_poll(void);

#endif  /* __PAGE_MGR_H__ */
